package com.wang.ymcc.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotations.TableField;
import com.wang.lwm.result.JSONResult;
import com.wang.lwm.util.AssertUtil;
import com.wang.lwm.util.CodeGenerateUtils;
import com.wang.ymcc.domain.CourseOrder;
import com.wang.ymcc.domain.CourseOrderItem;
import com.wang.ymcc.dto.CourseItemVo;
import com.wang.ymcc.dto.CourseOrderDaraVo;
import com.wang.ymcc.dto.OrderDto;
import com.wang.ymcc.feignclient.CourseServerFegin;
import com.wang.ymcc.mapper.CourseOrderMapper;
import com.wang.ymcc.service.ICourseOrderItemService;
import com.wang.ymcc.service.ICourseOrderService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import net.sf.jsqlparser.statement.select.Join;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author whale
 * @since 2022-11-02
 */
@Service
public class CourseOrderServiceImpl extends ServiceImpl<CourseOrderMapper, CourseOrder> implements ICourseOrderService {

    @Autowired
    private RedisTemplate<Object,Object> template;
    @Autowired
    private CourseServerFegin courseServerFegin;
    @Autowired
    private ICourseOrderItemService courseOrderItem;

    @Override
    public void placeOrder(OrderDto orderDto) {
        //获取id  courseIds  [1,2,3] --->"1,2,3"
        String ids = StringUtils.join(orderDto.getCourseIds(), ",");
        //用户id
        Long id = 3l;
        //校验token是否正确
        Object o = template.opsForValue().get(id + ":" + ids);
        //如果token不存在，表示已经提交了订单 不用重复提交
        AssertUtil.isNotNull(o,"订单以创建");
        String s = o.toString();
        String token = orderDto.getToken();
        //判断token是否相等
        AssertUtil.isEqualsTrim(s,token,"订单以创建");
        //通过fegin接口调用 获取course和maket数据
        JSONResult info = courseServerFegin.info(ids);
        //数据转换（序列化）
        String s1 = JSON.toJSONString(info.getData());
        CourseOrderDaraVo courseOrderDaraVo = JSON.parseObject(s1, CourseOrderDaraVo.class);
        //生成的order
        CourseOrder courseOrder = new CourseOrder();
        /**
         * 创建时间
         */
        courseOrder.setCreateTime(new Date());
        /**
         * 最后支付更新时间
         */
        /**
         * 订单编号
         */
        String coursesn = CodeGenerateUtils.generateOrderSn(id);
        courseOrder.setOrderNo(coursesn);
        courseOrder.setTotalAmount(new BigDecimal("322"));
        /**
         * 支付总的价格
         */
        courseOrder.setPayAmount(courseOrderDaraVo.getTotalAmount());
        /**
         * 优惠金额
         */
        courseOrder.setDiscountAmount(courseOrder.getTotalAmount());
        /**
         * 支付金额
         */
        courseOrder.setPayAmount(courseOrder.getTotalAmount());
        /**
         * 秒杀数量
         */
        courseOrder.setTotalCount(1);
        /**
         *     // 订单状态 ：
         //0下单成功待支付，
         //1支付成功订单完成
         //2用户手动取消订单(未支付)
         //3.支付失败
         //4.超时自动订单取消
         */
        courseOrder.setStatusOrder(1);
        /**
         * 用户
         */
        courseOrder.setUserId(id);
        /**
         * 订单标题
         */
        courseOrder.setTitle("课程下单");
        courseOrder.setVersion(1);
        /**
         * 支付方式:0余额直接，1支付宝，2微信,3银联
         */
        courseOrder.setPayType(1);
        /**
         * 0普通订单 ， 1秒杀订单
         */
        courseOrder.setOrderType(0);
        insert(courseOrder);

        //根据详情，生成对应的订单详情
        List<CourseItemVo> list = courseOrderDaraVo.getList();
        list.forEach(courseItemVo->{
            CourseOrderItem ltem = new CourseOrderItem();
            ltem.setOrderId(courseOrder.getId());
            /**
             * 课程的价格
             */
            ltem.setAmount(courseItemVo.getCourseMarket().getPrice());
            /**
             * 课程的数量
             */
            ltem.setCount(1);
            /**
             * 创建时间
             */
            ltem.setCreateTime(new Date());
            /**
             * 课程ID
             */
            ltem.setCourseId(courseItemVo.getCourse().getId());
            /**
             * 课程名字
             */
            ltem.setCourseName(courseItemVo.getCourse().getName());
            /**
             * 封面
             */
            ltem.setCoursePic(courseItemVo.getCourse().getPic());
            ltem.setVersion(0);
            ltem.setOrderNo(coursesn);

            courseOrderItem.insert(ltem);
        });
        template.delete(id+":"+ids);
    }
}
